package controller

import (
	"github.com/kataras/iris/v12"
	"strings"
	"wit-admin-go/system/app/dto"
	"wit-admin-go/system/app/service"
	"wit-admin-go/system/utils"
)

type CasbinController struct{}

var WitCasbin = new(CasbinController)

// AddCasbin 添加角色权限
//
//	@Summary		添加角色权限
//	@Description	为角色添加接口权限
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			roleId		query	string		true	"角色ID"
//	@Param			apisId		query	[]string	true	"接口ID"
//	@Success		200
//	@Router			/casbin/addCasbin [post]
//
// @Security ApiKeyAuth
func (us *CasbinController) AddCasbin(ctx iris.Context) {
	res := new(dto.Result)
	apis := new([]dto.Apis)
	roleId := ctx.FormValue("roleId")
	apisId := strings.Split(ctx.FormValue("apisId"), ",")
	if roleId == "" || len(apisId) == 0 {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	// 获取接口信息
	err := utils.DB.Where("id IN ?", apisId).Find(&apis).Error
	if err != nil {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusNotFound, "数据没找到"))
		return
	}
	if len(*apis) == 0 {
		res.Msg = "暂无可添加权限"
		res.Code = iris.StatusOK
		_ = ctx.JSON(res)
		return
	}
	for _, item := range *apis {
		_, _ = utils.WitEnforcer.AddPermissionForUser(roleId, item.Path, item.Method)
	}
	res.Msg = "添加成功"
	res.Code = iris.StatusOK
	_ = ctx.JSON(res)
}

// DeleteCasbin 删除角色权限
//
//	@Summary		删除角色权限
//	@Description	删除角色的接口权限
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			roleId		query	string		true	"角色ID"
//	@Param			apisId		query	[]string	true	"接口ID"
//	@Success		200
//	@Router			/casbin/deleteCasbin [delete]
//
// @Security ApiKeyAuth
func (us *CasbinController) DeleteCasbin(ctx iris.Context) {
	res := new(dto.Result)
	apis := new([]dto.Apis)
	roleId := ctx.FormValue("roleId")
	apisId := strings.Split(ctx.FormValue("apisId"), ",")
	if roleId == "" || len(apisId) == 0 {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	// 获取接口信息
	err := utils.DB.Where("id IN ?", apisId).Find(&apis).Error
	if err != nil {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusNotFound, "数据没找到"))
		return
	}
	if len(*apis) == 0 {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusOK, "暂无可删除权限"))
		return
	}
	for _, item := range *apis {
		_, _ = utils.WitEnforcer.DeletePermissionForUser(roleId, item.Path, item.Method)
	}
	res.Msg = "删除成功"
	res.Code = iris.StatusOK
	_ = ctx.JSON(res)
}

// AddRoleForUser 添加用户角色
//
//	@Summary		添加用户角色
//	@Description	为用户绑定角色-只添加接口权限-废弃
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			userId		query	string	true	"用户ID"
//	@Param			roleId		query	string	true	"角色ID"
//	@Success		200
//	@Router			/casbin/addRoleForUser [post]
//
// @Security ApiKeyAuth
func (us *CasbinController) AddRoleForUser(ctx iris.Context) {
	res := new(dto.Result)
	userId := ctx.FormValue("userId")
	roleId := ctx.FormValue("roleId")
	if userId == "" || roleId == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	//for _, item := range roles {
	//	_, _ = utils.WitEnforcer.AddRoleForUser(userId, item)
	//}
	_, _ = utils.WitEnforcer.AddRoleForUser(userId, roleId)
	res.Msg = "绑定成功"
	res.Code = iris.StatusOK
	_ = ctx.JSON(res)
}

// PutRoleForUser 修改用户角色
//
//	@Summary		修改用户角色
//	@Description	为用户修改角色和对应的接口权限
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			userId		query	string	true	"用户ID"
//	@Param			roleId		query	string	true	"角色ID"
//	@Success		200
//	@Router			/casbin/putRoleForUser [put]
//
// @Security ApiKeyAuth
func (us *CasbinController) PutRoleForUser(ctx iris.Context) {
	res := new(dto.Result)
	userId := ctx.FormValue("userId")
	roleId := ctx.FormValue("roleId")
	if userId == "" || roleId == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	err := service.CasbinService.PutCasbinRolesBindUser(userId, roleId)
	if err != nil {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusInternalServerError, err.Error()))
		return
	}
	res.Msg = "修改成功"
	res.Code = iris.StatusOK
	_ = ctx.JSON(res)
}

// DeleteRoleForUser 删除用户角色
//
//	@Summary		删除用户角色
//	@Description	删除用户角色
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			userId		query	string	true	"用户ID"
//	@Success		200
//	@Router			/casbin/deleteRoleForUser [delete]
//
// @Security ApiKeyAuth
func (us *CasbinController) DeleteRoleForUser(ctx iris.Context) {
	res := new(dto.Result)
	userId := ctx.FormValue("userId")
	//roleId := ctx.FormValue("roleId")
	if userId == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	err := service.CasbinService.DeleteCasbinRolesBindUser(userId)
	if err != nil {
		res.Msg = err.Error()
	} else {
		res.Msg = "删除成功"
	}
	res.Code = iris.StatusOK
	_ = ctx.JSON(res)
}

// GetCasbinPolicy 获取角色权限
//
//	@Summary		获取角色权限
//	@Description	获取角色权限
//	@Tags			casbin
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			roleId		query	string	true	"角色ID"
//	@Success		200
//	@Router			/casbin/getCasbinPolicy [get]
//
// @Security ApiKeyAuth
func (us *CasbinController) GetCasbinPolicy(ctx iris.Context) {
	res := new(dto.Result)
	var permission []interface{}
	roleId := ctx.FormValue("roleId")
	if roleId == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}
	// 获取接口信息
	P := utils.WitEnforcer.GetPermissionsForUser(roleId)
	if len(P) == 0 {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusNotFound, "数据没找到"))
		return
	}
	for _, item := range P {
		p := new(dto.ApiPermission)
		p.RoleId = item[0]
		p.Path = item[1]
		p.Method = item[2]
		permission = append(permission, p)
	}
	res.Msg = "获取成功"
	res.Code = iris.StatusOK
	res.Data = permission
	_ = ctx.JSON(res)
}
